const db = require('../db/index')

// 文件模块
const fs = require('fs')
const path = require('path')


/*
 * file_name 文件名
 * file_url 文件地址
 * file_size 文件大小
 * upload_person 上传者 
 * upload_time 上传时间
 * download_number 下载次数
 */

// 上传文件  前端参数: 文件信息
exports.uploadFile = (req, res) => {
  // 拿到老名字
  let oldName = req.files[0].filename  // 033afce97fc1f5151277ae5d18b4444f
  // 拿到文件名
  let fileName = req.files[0].originalname // test.jpg
  // 把 文件名 转换成 utf-8 格式
  let newName = Buffer.from(fileName, 'latin1').toString('utf-8') // tetst.jpg
  // 判断该文件名是否存在
  const sql = `select * from files where file_name = ?`
  db.query(sql, newName, (err, result) => {
    if (err) return res.cc(err)
    if (result.length > 1) {
      res.cc('该文件名存在', 1)
    } else {
      // 把有老名字乱码的路径 重命名成 新名字路径
      fs.renameSync('./public/upload/' + oldName, './public/upload/' + newName)
      // 上传时间
      const upload_time = new Date()
      const sql2 = `insert into files set ?`
      db.query(sql2, {
        file_url: `http://127.0.0.1:3007/upload/${newName}`,
        file_name: newName,
        file_size: req.files[0].size * 1 / 1024,
        upload_time,
        download_number: 0
      }, (err, results) => {
        if (err) return res.cc(err)
        res.send({
          status: 0,
          url: `http://127.0.0.1:3007/upload/${newName}`,
          message: '上传文件成功'
        })
      })
    }
  })
}

// 绑定上传者 前端参数: 上传者, 图片 url
exports.bindUploadPerson = (req, res) => {
  const sql = `update files set upload_person = ? where file_url = ?`
  db.query(sql, [req.body.upload_person, req.body.file_url], (err, results) => {
    if (err) return res.cc(err)
    res.cc('绑定成功', 0)
  })
}

// 更新下载量 前端参数: 当前下载量 id
exports.updateDownloadNumber = (req, res) => {
  const { download_number, id } = req.body
  let number = download_number * 1 + 1
  const sql = `update files set download_number = ? where id = ?`
  db.query(sql, [number, id], (err, result) => {
    if (err) return res.cc(err)
    res.cc('更新下载量成功', 0)
  })
}

// 下载文件 前端参数 id
exports.downloadFile = (req, res) => {
  const { id } = req.body
  const sql = `select file_name from files where id = ?`
  db.query(sql, id, (err, result) => {
    if (err) return res.cc(err, 1)
    const fileName = result[0].file_name
    const filePath = path.join(path.dirname(__dirname), 'public', 'upload', fileName)
    console.log(filePath) // D:\Workplace\AAA\project\manage\backstage-manage\public\upload\q6AAN6ci.jpg

    // fs.access 检查文件是否存在
    fs.access(filePath, fs.constants.F_OK, (err) => {
      if (err) return res.cc(err, 1)

      // 编码文件名 解决了下载不了中文名的文件问题
      const encodedFileName = encodeURIComponent(fileName) // 编码文件名
      // 设置下载文件类型 application/octet-strea 表示任意的二进制数据
      const mimeType = 'application/octet-stream'
      // 告诉浏览器将 响应的内容 作为 文件下载 而不是 直接打开
      // res.setHeader('Content-Disposition', `attachment; filename="${fileName}"`)
      // 注意这里使用 encodedFileName，但在 filename* 参数中提供原始文件名（可选，用于现代浏览器识别原始文件名）
      res.setHeader('Content-Disposition', `attachment; filename="${encodedFileName}"; filename*=utf-8''${encodedFileName}`)
      // 设置 HTTP 响应头 Content-Type，表示响应的内容是任意二进制数据
      res.setHeader('Content-Type', mimeType)
      // 创建可读流并传递给响应对象
      const fileStream = fs.createReadStream(filePath)
      fileStream.pipe(res)
    })
  })
}


// 获取文件列表 前端参数：无
exports.getFileList = (req, res) => {
  const sql = 'select * from files'
  db.query(sql, (err, result) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      data: result
    })
  })
}

// 获取文件列表总数 前端参数: 无
exports.getFileListCount = (req, res) => {
  const sql = 'select * from files '
  db.query(sql, (err, result) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      data: result.length
    })
  })
}

// 文件模糊搜索 前端参数: 文件名
exports.searchFile = (req, res) => {
  const file_name = req.body.file_name
  const sql = `select * from files where file_name like '%${file_name}%'`
  db.query(sql, (err, result) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      message: '模糊搜索文件成功',
      data: result
    })
  })
}

// 删除文件 参数: id, file_name
exports.deleteFile = (req, res) => {
  const sql = `delete from files where id = ?`
  db.query(sql, req.body.id, (err, result) => {
    if (err) return res.cc(err)
    // 使用 fs.unlink 对服务器的文件进行删除
    fs.unlink(`./public/upload/${req.body.file_name}`, (err) => {
      if (err) return res.cc(err)
    })
    res.send({
      status: 0,
      message: '删除文件成功'
    })
  })
}

// 文件列表分页 前端参数: pager
exports.getFileListByPager = (req, res) => {
  const pager = (req.body.pager - 1) * 5
  const sql = `select * from files limit 5 offset ${pager}`
  db.query(sql, (err, result) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      message: `获取第${pager + 1} 文件列表成功`,
      data: result
    })
  })
}

// 根据 id 获取文件信息 前端参数: id
exports.getFileById = (req, res) => {
  const sql = `select * from files where id = ?`
  db.query(sql, req.body.id, (err, result) => {
    if (err) return res.cc(err)
    res.send({
      status: 0,
      message: '获取文件信息成功',
      data: result
    })
  }
  )
}